x

Hermes Agent 源码架构详解

基于 v0.12.0 (2026.4.30) 源码分析

一、顶层目录总览

hermes-agent/
├── hermes_cli/          # CLI 主入口(argparse 命令体系)
├── agent/               # AI Agent 核心引擎
├── gateway/             # 消息网关(平台适配层)
├── tui_gateway/         # TUI JSON-RPC 后端
├── acp_adapter/         # ACP 编辑器协议适配器
├── environments/        # RL 训练环境 / Benchmark
├── plugins/             # 插件体系(记忆/图像/平台)
├── skills/              # 内置 Skill 库
├── optional-skills/     # 可选 Skill(区块链/健康/研究等)
├── web/                 # Web 前端(TypeScript React)
├── website/             # 官方文档站(Docusaurus)
├── scripts/             # 工具脚本
├── cron/                # Cron 调度
├── docs/                # 开发文档
├── docker/              # Docker 配置
└── packaging/           # 打包配置(Homebrew 等)

二、核心模块详解

2.1 hermes_cli/ — 命令行入口(约50个模块)

职责:用户交互的 CLI 顶层,argparse 命令树管理,所有用户输入的入口。

模块 职责
main.py CLI 总入口,命令分发调度
config.py 读写 ~/.hermes/config.yaml,缓存机制
providers.py Provider 定义 + Overlay 合并层
models.py 模型目录、验证助手、API tier
auth.py 多 Provider 认证(OAuth + API key)
setup.py 交互式配置向导
commands.py Slash 命令定义COMMAND_REGISTRY
cli.py HermesCLI 主类,运行 AIAgent
gateway.py Gateway 服务管理(systemd/launchd)
skin_engine.py 6种皮肤主题系统
banner.py 启动横幅 + ASCII 艺术
profiles.py 多配置文件(--profile
env_loader.py .env 文件加载,非 ASCII 清理
backup.py SQLite zip 备份/导入
voice.py 录音 + TTS API
kanban.py 看板 CLI
pty_bridge.py PTY↔WebSocket 桥接(xterm.js)
completion.py Bash/Zsh/Fish 补全脚本生成

连接关系main.py 是调度中心,按需导入 config.py(配置)、providers.py(模型)、auth.py(认证),最终通过 cli.pyHermesCLI 运行 AIAgent。

2.2 agent/ — AI Agent 核心引擎(28个模块)

职责:LLM 调用、上下文管理、工具分发、错误恢复。是整个系统最核心的业务逻辑层。

模块 大小 职责
run_agent.py AIAgent 主循环,API 请求 + 工具分发
curator.py 25.9KB 上下文策展(消息管理 + 压缩决策)
prompt_builder.py 31.6KB 最大文件,构建完整 prompt(系统提示 + 工具 + 消息历史)
context_compressor.py 25.2KB 上下文压缩实现(DAG + 摘要)
error_classifier.py 37.7KB API 错误分类 + 恢复策略(最大文件)
display.py 38.7KB CLI 展示(spinner / diff 渲染)
gemini_native_adapter.py 33.8KB Gemini 原生 API 适配器
bedrock_adapter.py 24.9KB AWS Bedrock 适配器
usage_pricing.py 22.1KB 用量追踪 + 成本计算
models_dev.py 20.8KB 模型能力元数据中央数据源
memory_manager.py 20.9KB 记忆 Provider 管理(内置 + 外部插件)
shell_hooks.py 29.6KB Shell 脚本钩子桥接
tool_guardrails.py 16.8KB 工具循环防护(防止无限循环)
moonshot_schema.py 9.6KB Moonshot 工具 Schema 转换
image_routing.py 8.5KB 用户图片路由(原生附件 vs 转文本)
context_engine.py 7.8KB 上下文引擎抽象基类(插件接口)
image_gen_provider.py 7.6KB 图像生成 Provider ABC
prompt_caching.py 2.2KB Anthropic Prompt Caching
redact.py 15.0KB 日志脱敏(API key 等)
title_generator.py 5.7KB 会话标题自动生成

架构要点

  • run_agent.py 是核心调度者
  • context_engine.py 定义抽象接口,context_compressor.py 是默认实现(可插拔)
  • 多适配器模式:bedrock_adapter.pygemini_native_adapter.py 等将 OpenAI 格式请求转换为各 Provider 格式
  • Provider 模式:记忆管理(memory_manager.py)、图像生成(image_gen_provider.py)均支持插件扩展

2.3 gateway/ — 消息网关(平台适配层)

职责:将 AIAgent 连接到各消息平台(微信/Telegram/Discord 等),是整个多渠道消息接入的中枢。

模块 职责
run.py Gateway 主入口,启动所有平台适配器
session.py 会话上下文追踪、消息来源路由、动态 system prompt
config.py 平台配置(Platform 枚举、SessionResetPolicy)
delivery.py Cron 任务输出路由(origin/local/wecom 等)
platform_registry.py 平台适配器注册中心(支持热插拔)
stream_consumer.py Agent token 流实时推送
pairing.py DM 配对码授权(secrets.choice + TTL + 限速)
hooks.py 生命周期事件钩子(startup/session/agent/command)
session_context.py ContextVar 替代 os.environ(asyncio 并发安全)

平台适配器platforms/):

  • 国内:feishu.pywecom.pydingtalk.py
  • 海外:telegram.pydiscord.pyslack.pywhatsapp.pysignal.py
  • 特殊:qqbot/(QQ 机器人,含 crypto + onboard)、api_server.py(HTTP API)、webhook.pyhomeassistant.py

2.4 tui_gateway/ — TUI JSON-RPC 后端

职责:为 iOS/Web 客户端提供 TUI 能力(JSON-RPC over stdio/WebSocket)。

文件 职责
entry.py 主入口,信号处理(SIGTERM/SIGHUP),stdin JSON-RPC 循环
server.py(5987行) JSON-RPC 方法注册/分发,会话管理,线程池处理慢操作
ws.py WebSocket 传输层,复用 server.dispatch()
transport.py I/O sink 抽象(Stdio/WebSocket/Tee),ContextVar 路由
event_publisher.py 仪表板侧边栏事件镜像(反向 WebSocket)
slash_worker.py 子进程运行 Slash 命令(会话隔离)
render.py 渲染桥接(agent.rich_output ↔ TUI markdown)

2.5 acp_adapter/ — ACP 编辑器协议适配器

职责:让 Hermes 作为 ACP Agent 运行在 Zed/VS Code 等编辑器里。

文件 职责
entry.py CLI 入口,加载 .env,启动 acp.run_agent()
server.py ACP Agent 服务器,暴露 create_message() 等接口
session.py ACP Session ↔ AIAgent 实例映射,持久化到 SessionDB
events.py AIAgent 事件 → ACP session_update 回调工厂
tools.py Hermes 工具名 → ACP ToolKind 映射
auth.py 检测当前配置的 Provider(api_key + provider)
permissions.py ACP 权限请求 → hermes approval 回调桥接

2.6 environments/ — RL 训练与 Benchmark

职责:Atropos RL 训练环境和各种任务评估基准。

文件 职责
agent_loop.py 多轮 tool-calling RL 引擎,ThreadPoolExecutor 避免 asyncio 死锁
hermes_base_env.py Atropos RL 训练基类(Phase 1 OpenAI server / Phase 2 ManagedServer)
web_research_env.py 多跳 Web 研究环境(FRAMES 数据集)
agentic_opd_env.py On-Policy Distillation 环境(OpenClaw-RL 论文实现)
hermes_swe_env/ SWE-Bench 风格,使用 Modal 云端沙箱
tool_call_parsers/ 各模型工具调用解析器(qwen/llama/deepseek/gemini/kimi 等)
benchmarks/yc_bench/ YC-Bench 长期战略评估(CEO 模拟)
benchmarks/terminalbench_2/ Terminal-Bench 2.0(89个任务,Docker/Modal 隔离)

2.7 plugins/ — 插件体系

职责:可插拔的扩展系统,通过抽象基类接口连接核心。

插件 关键实现
memory/ 7种记忆 Provider:mem0(语义搜索)、honcho(dialectic/recall)、holographicsupermemoryretaindbbyterover
image_gen/ 图像生成:openai(gpt-image-2)、xaiopenai-codex
platforms/ TeamsAdapter(Microsoft Teams webhook + AdaptiveCard)、IrcAdapter
spotify/ Spotify 播放/设备/队列/搜索/播放列表控制
kanban/ 看板(前端 + systemd 服务)
hermes-achievements/ 成就系统
context_engine/ 可插拔上下文压缩引擎
observability/langfuse/ LLM 可观测性(Langfuse 集成)

连接方式:插件实现抽象基类(MemoryProvider/ImageGenProvider/BasePlatformAdapter),通过 ctx.register_*() 注册到核心。

三、模块间依赖关系

3.1 整体架构图

                         ┌─────────────────────────────┐
                         │         用户输入             │
                         │  (CLI / Gateway / ACP / TUI) │
                         └──────────────┬──────────────┘
                                        │
                    ┌───────────────────┼───────────────────┐
                    ↓                   ↓                   ↓
             ┌──────────────┐  ┌──────────────┐  ┌──────────────┐
             │ hermes_cli/  │  │  gateway/    │  │ acp_adapter/ │
             │  commands.py │  │   run.py     │  │  server.py   │
             │  (slash cmds)│  │ (平台适配中枢) │  │  (编辑器协议) │
             └──────┬───────┘  └──────┬───────┘  └──────┬───────┘
                    │                 │                 │
                    └────────┬────────┴────────┬────────┘
                             ↓                ↓
                    ┌──────────────────────────────┐
                    │        agent/run_agent.py      │
                    │      AIAgent 主循环(核心引擎)  │
                    └──────────────────────────────┘
                             │
         ┌───────────────────┼───────────────────┐
         ↓                   ↓                   ↓
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ prompt_builder   │ │ curator.py       │ │ memory_manager   │
│ 构建完整prompt    │ │ 上下文策展/压缩   │ │ 记忆provider管理  │
│ (最大文件31.6KB) │ │                 │ │                 │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
         │                   │                   │
         │          ┌────────┴────────┐          │
         │          ↓                 ↓          │
         │ ┌────────────────┐  ┌──────────────┐ │
         │ │context_compressor│  │context_engine│ │
         │ │ (默认压缩实现)   │  │ (抽象基类接口) │ │
         │ └────────────────┘  └──────────────┘ │
         │                                     │
         └──────────────┬──────────────────────┘
                        ↓
          ┌───────────────────────────────┐
          │     agent/run_agent.py         │
          │   API请求 → 工具分发 → 响应    │
          └───────────────────────────────┘
                        │
         ┌──────────────┼──────────────┐
         ↓              ↓              ↓
  ┌────────────┐ ┌────────────┐ ┌────────────┐
  │Bedrock适配器│ │Gemini适配器 │ │ models_dev │
  │            │ │            │ │ (模型元数据) │
  └────────────┘ └────────────┘ └────────────┘

3.2 六条主线脉络

脉络一:CLI 交互线

main.py → cli.py → run_agent.py → 返回终端
         ↑
    commands.py(slash命令定义COMMAND_REGISTRY)

用户敲 hermes chatmain.py 解析 → cli.pyHermesCLI 运行 → run_agent.py 执行推理 → 结果回显终端。

脉络二:消息平台线

gateway/run.py(总调度)
    ├── session.py(会话上下文)
    ├── platform_registry.py(平台注册表)
    ├── delivery.py(输出路由)
    └── platforms/{telegram,wechat,wecom,...}.py(各平台适配器)

一个进程里跑所有平台,收到消息 → 路由到对应 session → run_agent.py → 响应推回平台。

脉络三:上下文压缩线

curator.py(策展人)
    ├── should_compress() → 判断何时压缩
    └── compress() → 调用 context_compressor
                      └── context_compressor.py(默认实现)
                          └── context_engine.py(抽象基类,可插拔)

消息越来越多 → curator 决定压缩 → context_compressor 构建 DAG 做摘要 → 结果写回消息历史。

脉络四:工具分发线

run_agent.py(收到LLM的tool_calls
    
display.py(预览工具调用)
    
工具执行(terminal/read_file/...]
    
tool_guardrails.py(循环检测)
    
结果返回 run_agent.py  继续下一轮

脉络五:Provider 适配线

models_dev.py(模型元数据中央)
    ↓
┌──────────────────────────────────────┐
│  bedrock_adapter.py  → AWS Bedrock   │
│  gemini_native_adapter.py → Google   │
│  moonshot_schema.py  → Moonshot     │
│  (各自转换 OpenAI格式 ↔ 各家格式)   │
└──────────────────────────────────────┘
    ↓
统一经过 error_classifier.py 做错误分类和重试策略
    ↓
nous_rate_guard.py(速率限制保护)

脉络六:插件扩展线

run_agent.py
    ↓
memory_manager.py ───→ plugins/memory/{mem0,holographic,honcho,...}.py
image_gen_provider.py ──→ plugins/image_gen/{openai,xai,...}.py
shell_hooks.py ──→ 用户自定义 shell 脚本钩子

(均通过抽象基类接口注册,可热插拔)

四、三大脉络交汇点

脉络 起点 终点 核心文件
用户交互 main.py 终端/平台 cli.py / gateway/run.py
推理执行 run_agent.py LLM API prompt_builder.py + 各 adapter
上下文管理 curator.py 消息历史 context_compressor.py + context_engine.py

三个脉络在 run_agent.py 交汇——它接收用户输入,调用 curator 构建 prompt,发送给 LLM,拿到 tool_calls 后分发执行,结果再流回 curator

五、源码文件统计

目录 Python文件数 主要职责
hermes_cli/ ~50 CLI 命令入口
agent/ ~28 AI Agent 核心引擎
gateway/ ~30 消息网关
tui_gateway/ 7 TUI JSON-RPC
acp_adapter/ 8 ACP 编辑器协议
environments/ ~15 RL 训练环境
plugins/ 50+ 插件体系
skills/ 100+ 内置 Skill 库
optional-skills/ 200+ 可选 Skill

注:以上数据为源码包级别的模块统计,不包含 venv 依赖包。

Left-click: follow link, Right-click: select node, Scroll: zoom
x